package com.atguigu.wulaoshi

object CloseAndCurrying {
  def main(args: Array[String]): Unit = {
     //闭包的应用
    def add(a:Int,b:Int):Int={
      a+b
    }
    //大数据场景下,有可能很多数据都是相同的,我们需要对这些数据做一个规约,让适用性更强,
    //把数据相同的情况下先算起来,再考虑不同的那些,再做叠加

    //1.考虑固定一个加数的场景
    def addByFour(b:Int): Int = {
      4+b //4为相同参数计算出来的和定死在这里
    }
    //2.扩展固定加数改变的情况,4可能变成5
    def addByFive(b:Int): Int = {
      5+b //情况太多会定义太多函数
    }
    //3.将固定加数作为另一个参数传入,但是是作为第一层参数传入
    def addByFour1():Int=>Int = {
      val a = 4
      def addByB(b:Int) : Int ={
        a + b
      }
      addByB
    }
    //4. 4不再写死
    def addByA(a:Int):Int=>Int={
      def addB(b:Int):Int={
        a+b
      }
      addB
    }
    //5.lambda表达式的简写
    def addByA1(a:Int):Int=>Int=(b:Int)=>a+b
    def addByA2(a:Int):Int=>Int=a+_
    //6.柯里化
    def addByCurrying(a:Int)(b:Int):Int=a+b
  }

}
